#include <iostream>

using namespace std;
// 622. 设计循环队列
// 设计你的循环队列实现。 循环队列是一种线性数据结构，其操作表现基于 FIFO（先进先出）原则并且队尾被连接在队首之后以形成一个循环。它也被称为“环形缓冲器”。

class MyCircularQueue {
public:
    // 构造器，设置队列长度为 k 。
    explicit MyCircularQueue(int k) {
        data = new int[k+1];    // 多用了一个元素空间，因此要k+1
        capacity = k+1;     // 队列的容量也是k+1
        front = rear = 0;
    }
    ~MyCircularQueue() {
        delete [] data;
    }
    // 向循环队列插入一个元素。如果成功插入则返回真。
    bool enQueue(int value) {
        if(isFull())
            return false;
        rear = (rear + 1) % capacity;
        data[rear] = value;
        return true;
    }
    // 从循环队列中删除一个元素。如果成功删除则返回真。
    bool deQueue() {
        if(isEmpty())
            return false;
        front = (front + 1) % capacity;
        return true;
    }
    // 从队首获取元素。如果队列为空，返回 -1 。
    int Front() {
        if(isEmpty())
            return -1;
        return data[(front + 1) % capacity];
    }
    // 获取队尾元素。如果队列为空，返回 -1 。
    int Rear() {
        if(isEmpty())
            return -1;
        return data[rear];
    }
    // 检查循环队列是否为空。
    bool isEmpty() {
        return front == rear;
    }
    // 检查循环队列是否已满。
    bool isFull() {
        if((rear + 1) % capacity == front)
            return true;
        return false;
    }

private:
    int *data;  // 存放队列中元素
    int front, rear;    // 队头，队尾指针
    int capacity;   // 容量
};

/**
 * Your MyCircularQueue object will be instantiated and called as such:
 * MyCircularQueue* obj = new MyCircularQueue(k);
 * bool param_1 = obj->enQueue(value);
 * bool param_2 = obj->deQueue();
 * int param_3 = obj->Front();
 * int param_4 = obj->Rear();
 * bool param_5 = obj->isEmpty();
 * bool param_6 = obj->isFull();
 */
int main() {
    MyCircularQueue circularQueue = MyCircularQueue(3); // 设置长度为 3
    cout << boolalpha << circularQueue.enQueue(1) << endl;  // 返回 true
    cout << boolalpha << circularQueue.enQueue(2) << endl;  // 返回 true
    cout << boolalpha << circularQueue.enQueue(3) << endl;  // 返回 true
    cout << boolalpha << circularQueue.enQueue(4) << endl;  // 返回 false，队列已满
    cout << circularQueue.Rear() << endl;  // 返回 3
    cout << boolalpha << circularQueue.isFull() << endl;  // 返回 true
    cout << boolalpha << circularQueue.deQueue() << endl;  // 返回 true
    cout << boolalpha << circularQueue.enQueue(4) << endl;  // 返回 true
    cout << boolalpha << circularQueue.Rear() << endl;  // 返回 4
    return 0;
}
